#include <stdio.h> 
#include <stdlib.h>
#include <sys/types.h> 
#include <sys/wait.h> 

//Cabeceras para las funciones manejadoras de señares
void manSIGUSR2(int sig);
void manSIGTERM(int sig);
void manSIGUSR1(int sig);

        int n=3; //Contador de procesos hijo por crear
        int i=0; //Numero de proceso hijo
	pid_t v[3]; //Array que va a almacenar los pids de los hijos creados

int main() 
{ 
        //Codigo de retorno de la función fork  
        pid_t hijo;
        
        //Mostramos la información del proceso padre
        printf("PADRE PID:%d, PPID: %d\n", getpid(), getppid());    

        //Bucle de creación de subprocesos hijo
        while (n!=0) {
        //Llamada a fork
        hijo=fork();    
                //Si la variable hijo tiene valor 0 es que estamos en un subproceso hijo
                if (hijo==0) {
                //Bucle while del hijo creado
		struct sigaction sigact;
        
		// Establecer gestor para señal SIGUSR2
		sigact.sa_handler = manSIGUSR2;
		sigact.sa_flags = SA_RESTART;
		sigaction(SIGUSR2, &sigact, 0);		
		//Bucle while del hijo		
		while (1) 
			{
			//Bucle while del hijo
			}  
                }  else {
			if (hijo>0) {
			v[i]=hijo;				
			} else printf("Error al crear el hijo %d \n",i+1);
		}      
        //Decrementamos el numero de subprocesos por crear (esto solo lo ejecuta el proceso padre)      
        n--;
        //Incrementamos el contador de subprocesos creados (esto solo lo ejecuta el proceso padre)
        i++;
        }
	struct sigaction sigact;
	sigact.sa_handler = manSIGTERM;
	sigact.sa_flags = SA_RESTART;
	sigaction(SIGTERM, &sigact, 0);	
	//Bucle while del proceso padre
	while (1) 
	{		
		while (n<i) {
		kill(v[n],SIGUSR2);
		sleep(5);	
		n++;
		}
		n=0;
	}    
}

void manSIGUSR2(int sig)
{    
        printf("Turno del proceso cuyo PID es %d\n",getpid());       
}

void manSIGTERM(int sig)
{    
	n=0;        
	while (n<i) {
	printf("Señal SIGKILL enviada al hijo %d cuyo PID es %d\n",n+1,v[n]);
	kill(v[n],SIGKILL);	
	n++;
	}   
	printf("Padre finaliza \n");
	exit(0);
}
